﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using HamsterEngine.SimElements;

namespace HamsterEngine
{
    public abstract class HamsterException : ApplicationException
    {
        public HamsterException(string msg, Point position, SimElement invoker) : base(msg) { }
    }

    /// <summary>
    /// Wird geworfen, wenn versucht wird, ein Korn abzulegen, der Hamster aber kein Korn im Maul hat.
    /// </summary>
    public class MaulLeerException : HamsterException
    {
        private string msg;
        private SimElement invoker;
        private Point position;

        public string Msg
        {
            get { return msg; }
        }
        public Point Position
        {
            get { return position; }
        }
        public SimElement Invoker
        {
            get { return invoker; }
        }

        public MaulLeerException(string msg, Point position, SimElement invoker)
            : base(msg, position, invoker)
        {
            this.msg = msg;
            this.position = position;
            this.invoker = invoker;
        }

        public override string ToString()
        {
            return msg + "\nBei " + position.X + "|" + position.Y + "\nHervorgerufen durch: " + invoker.ToString();
        }
    }

    /// <summary>
    /// Wird geworfen, wenn der Hamster gegen eine Mauer oder gegen die Feldbegrenzung läuft.
    /// </summary>
    public class MauerDaException : HamsterException
    {
        private string msg;
        private SimElement invoker;
        private Point position;

        public string Msg
        {
            get { return msg; }
        }
        public Point Position
        {
            get { return position; }
        }
        public SimElement Invoker
        {
            get { return invoker; }
        }

        public MauerDaException(string msg, Point position, SimElement invoker)
            : base(msg, position, invoker)
        {
            this.msg = msg;
            this.position = position;
            this.invoker = invoker;
        }

        public override string ToString()
        {
            return msg + "\nBei " + position.X + "|" + position.Y + "\nHervorgerufen durch: " + invoker.ToString();
        }
    }

    /// <summary>
    /// Wird geworfen, wenn versucht wird ein Korn von einem Feld zu nehmen, das keine Körner beinhaltet
    /// </summary>
    public class KachelLeerException : HamsterException
    {
        private string msg;
        private SimElement invoker;
        private Point position;

        public string Msg
        {
            get { return msg; }
        }
        public Point Position
        {
            get { return position; }
        }
        public SimElement Invoker
        {
            get { return invoker; }
        }

        public KachelLeerException(string msg, Point position, SimElement invoker)
            : base(msg, position, invoker)
        {
            this.msg = msg;
            this.position = position;
            this.invoker = invoker;
        }

        public override string ToString()
        {
            return msg + "\nBei " + position.X + "|" + position.Y + "\nHervorgerufen durch: " + invoker.ToString();
        }
    }
}
